﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Bastanteo.Domain;
using System.Data.SqlClient;

namespace Bastanteo.Persistencia.ADO
{
    public class RepresentanteDAO : IrepresentanteDAO 
    {
        // Dependencias
        ICargoDAO cargoDAO = new CargoDAO();
        IClienteDAO clienteDAO = new ClienteDAO();
        IGrupoDAO grupoDAO = new GrupoDAO();

        public Representante Crear(Representante r)
        {
            using (SqlConnection con = new SqlConnection(Conexion.ObtenerCadena()))
            {
                
                //if (r.RepresentanteNumDoc != null)
                //{
                    con.Open();
                    string sql = "insert into representante values (@num, @tip, @nom, @ape, @car, @cli, @gru)";
                    using (SqlCommand com = new SqlCommand(sql, con))
                    {
                        com.Parameters.AddWithValue("@num", r.RepresentanteNumDoc);
                        com.Parameters.AddWithValue("@tip", r.RepresentanteTipoDoc);
                        com.Parameters.AddWithValue("@nom", r.RepresentanteNombre);
                        com.Parameters.AddWithValue("@ape", r.RepresentanteApellidos);
                        com.Parameters.AddWithValue("@car", r.CargoId);
                        com.Parameters.AddWithValue("@cli", r.ClienteId);
                        com.Parameters.AddWithValue("@gru", r.GrupoId);
                        com.ExecuteNonQuery();
                    }
                //}
            }
            return Obtener(r.RepresentanteNumDoc);
        }
        public Representante Obtener(string dni)
        {
            Representante o = null;
            using (SqlConnection con = new SqlConnection(Conexion.ObtenerCadena()))
            {
                con.Open();
                string sql = "select * from representante where RepresentanteNumDoc=@d";
                using (SqlCommand com = new SqlCommand(sql, con))
                {
                    com.Parameters.AddWithValue("@d", dni);
                    SqlDataReader r = com.ExecuteReader();
                    if (r.Read())
                    {
                        o = new Representante();
                        o.RepresentanteNumDoc = (string)r["RepresentanteNumDoc"];
                        o.RepresentanteTipoDoc = (string)r["RepresentanteTipoDoc"];
                        o.RepresentanteNombre = (string)r["RepresentanteNombre"];
                        o.RepresentanteApellidos = (string )r["RepresentanteApellidos"];
                        o.CargoId = (int)r["CargoId"];
                        o.ClienteId = (string)r["ClienteId"];
                        o.GrupoId = (int)r["GrupoId"];
                        
                    }
                }
            }
            return o;
        }
        public Representante Modificar(Representante r)
        {
            using (SqlConnection con = new SqlConnection(Conexion.ObtenerCadena()))
            {
                con.Open();
                string sql = "update representante set RepresentanteTipoDoc=@tip, RepresentanteNombre=@nom, RepresentanteApellidos=@ape, CargoId=@car,ClienteId=@cli, GrupoId=@gru where RepresentanteNumDoc=@num";
                using (SqlCommand com = new SqlCommand(sql, con))
                {
                    com.Parameters.AddWithValue("@num", r.RepresentanteNumDoc);
                    com.Parameters.AddWithValue("@tip", r.RepresentanteTipoDoc);
                    com.Parameters.AddWithValue("@nom", r.RepresentanteNombre);
                    com.Parameters.AddWithValue("@ape", r.RepresentanteApellidos);
                    com.Parameters.AddWithValue("@car", r.CargoId);
                    com.Parameters.AddWithValue("@cli", r.ClienteId);
                    com.Parameters.AddWithValue("@gru", r.GrupoId);
                    com.ExecuteNonQuery();
                }
            }
            return Obtener(r.RepresentanteNumDoc );
        }
        public void Eliminar(Representante r)
        {
            using (SqlConnection con = new SqlConnection(Conexion.ObtenerCadena()))
            {
                con.Open();
                string sql = "delete from representante where RepresentanteNumDoc=@d";
                using (SqlCommand com = new SqlCommand(sql, con))
                {
                    com.Parameters.AddWithValue("@d", r.RepresentanteNumDoc );
                    com.ExecuteNonQuery();
                }
            }
        }
        // Métodos Listar
        public ICollection<Representante> Listar()
        {
            string _Sentencia = @"Select RepresentanteNumDoc, RepresentanteTipoDoc, RepresentanteNombre, RepresentanteApellidos, CargoID, ClienteID, GrupoID from representante";
            ICollection<Representante> ObjEncontrados = new List<Representante>();
            Representante objEncontrado = null;
            using (SqlConnection _Conexion = new SqlConnection(Conexion.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        while (_Resultado.Read())
                        {
                            objEncontrado = new Representante();
                            objEncontrado.RepresentanteNumDoc = (string)_Resultado["RepresentanteNumDoc"];
                            objEncontrado.RepresentanteTipoDoc = (string)_Resultado["RepresentanteTipoDoc"];
                            objEncontrado.RepresentanteNombre = (string)_Resultado["RepresentanteNombre"];
                            objEncontrado.RepresentanteApellidos = (string)_Resultado["RepresentanteApellidos"];
                            objEncontrado.CargoId = cargoDAO.Obtener((int)_Resultado["CargoID"]).CargoId;
                            objEncontrado.ClienteId = clienteDAO.Obtener((string)_Resultado["ClienteID"]).ClienteId;
                            objEncontrado.GrupoId = grupoDAO.Obtener((int)_Resultado["GrupoID"]).GrupoId;
                            ObjEncontrados.Add(objEncontrado);
                        }
                    }
                }
            }
            return ObjEncontrados;
        }
        public ICollection<Representante> ListarXBusqueda(string nNumdoc, string Tipodoc, string Representante, Cargo cargo)
        {
            string _Sentencia = @"Select RepresentanteNumDoc, RepresentanteTipoDoc, RepresentanteNombre, RepresentanteApellidos, CargoID, ClienteID, GrupoID from representante WHERE 1=1";
            ICollection<Representante> ObjEncontrados = new List<Representante>();
            Representante objEncontrado = null;
            using (SqlConnection _Conexion = new SqlConnection(Conexion.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand())
                {
                    if (nNumdoc != null)
                    {
                        _Sentencia = _Sentencia + " AND RepresentanteNumDoc=@RepresentanteNumDoc";
                        _Comando.Parameters.Add(new SqlParameter("@RepresentanteNumDoc", nNumdoc));
                    }
                    if (Tipodoc != null)
                    {
                        _Sentencia = _Sentencia + " AND RepresentanteTipoDoc=@RepresentanteTipoDoc";
                        _Comando.Parameters.Add(new SqlParameter("@RepresentanteTipoDoc", Tipodoc));
                    }

                    if (Representante != null)
                    {
                        _Sentencia = _Sentencia + " AND RepresentanteNombre LIKE '%'+@RepresentanteNombre+'%'";
                        _Comando.Parameters.Add(new SqlParameter("@RepresentanteNombre", Representante));
                    }
                    if (cargo != null)
                    {
                        _Sentencia = _Sentencia + " AND CargoID=@CargoID";
                        _Comando.Parameters.Add(new SqlParameter("@CargoID", cargo.CargoId));
                    }
                    _Comando.CommandText = _Sentencia;
                    _Comando.Connection = _Conexion;
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        while (_Resultado.Read())
                        {
                            objEncontrado = new Representante();
                            objEncontrado.RepresentanteNumDoc = (string)_Resultado["RepresentanteNumDoc"];
                            objEncontrado.RepresentanteTipoDoc = (string)_Resultado["RepresentanteTipoDoc"];
                            objEncontrado.RepresentanteNombre = (string)_Resultado["RepresentanteNombre"];
                            objEncontrado.RepresentanteApellidos = (string)_Resultado["RepresentanteApellidos"];
                            objEncontrado.CargoId = cargoDAO.Obtener((int)_Resultado["CargoID"]).CargoId;
                            objEncontrado.ClienteId = clienteDAO.Obtener((string)_Resultado["ClienteID"]).ClienteId;
                            objEncontrado.GrupoId = grupoDAO.Obtener((int)_Resultado["GrupoID"]).GrupoId;
                            ObjEncontrados.Add(objEncontrado);
                        }
                    }
                }
            }
            return ObjEncontrados;
        }

        // Métodos de soporte
        private int GenerarNuevoCodigo()
        {
            string _Sentencia = "SELECT max(UsuarioID) FROM Usuarios";
            int _NuevoCodigo = 0;
            using (SqlConnection _Conexion = new SqlConnection(Conexion.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    object _Resultado = _Comando.ExecuteScalar();
                    if (DBNull.Value.Equals(_Resultado)) // No hay datos en la tabla
                        _NuevoCodigo = 1;
                    else
                        _NuevoCodigo = (int)_Resultado + 1;
                }
            }
            return _NuevoCodigo;
        }

    
    }
}